//C14.19:pairs.cpp --defining and using a Pair template
#include <iostream>
#include <string>
template <class T1, class T2>
class Pair
{
    T1 a;
    T2 b;
    public:
        T1 & first();
        T2 & second();
        T1 first() const { return a; }
        T2 second() const { return b; }
        Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval){}
        Pair() {}
};

template<class T1, class T2>
T1 & Pair<T1, T2>::first()
{
    return a;
}

template<class T1, class T2>
T2 & Pair<T1, T2>::second()
{
    return b;
}

int main(void)
{
    using std::cout;
    using std::cin;
    using std::string;

    Pair<string, int> ratings[4] = 
    {
        Pair<string, int>("The Purpleed Duck", 5),
        Pair<string, int>("Jaquie's Frisco Al Fresco", 4),
        Pair<string, int>("Cafe Souffle", 5),
        Pair<string, int>("Bertie's Eats", 3)
    };

    int joints = sizeof(ratings) / sizeof(Pair<string, int>);
    cout << "Rating:\t Eatery\n";
    for(int i = 0; i < joints; i++)
    {
        cout << ratings[i].second() << ":\t "
             << ratings[i].first() << std::endl;
    }

    cout << "Oops! Revised rating:\n";
    ratings[3].first() = "Berite's Fab Eats";
    ratings[3].second() = 6;
    cout << ratings[3].second() << ":\t "
         << ratings[3].first() << std::endl;
}
